// 引入 axios 库，用于发起 HTTP 请求
import axios from 'axios'

// 引入 Pinia 中的 useAuthStore，用于获取用户 token 和执行登出操作
import { useAuthStore } from '../stores/auth'

/**
 * 创建一个自定义配置的 axios 实例
 * 所有项目中的 API 请求建议使用此实例，以便统一管理
 */
const api = axios.create({
  // 设置请求的基础 URL，后续所有使用该实例发起的请求都会以这个地址为前缀
  baseURL: 'http://localhost:8080',

  // 设置请求超时时间（单位：毫秒），超过该时间未响应则中断请求
  timeout: 10000,

  // 设置请求头信息，如 Content-Type、Accept 等
  headers: {
    'Content-Type': 'application/json',
    Accept: 'application/json',
  },
})

/**
 * 请求拦截器（Request Interceptor）
 * 在请求发送之前做一些处理，例如添加认证头信息、统一日志等
 */
api.interceptors.request.use(
  // 请求成功发送前的拦截逻辑
  (config) => {
    // 获取当前用户的 authStore 实例
    const authStore = useAuthStore()

    // 如果用户已登录（存在 token），则在请求头中添加 Authorization 字段
    if (authStore.token) {
      config.headers.Authorization = `Bearer ${authStore.token}`
      config.headers.token = authStore.token
    }

    // 返回修改后的请求配置，继续发送请求
    return config
  },
  // 请求失败时的拦截逻辑（如网络错误、请求取消等）
  (error) => {
    // 将错误传递给 Promise.reject，触发后续 catch 处理
    return Promise.reject(error)
  }
)

/**
 * 响应拦截器（Response Interceptor）
 * 在接收到响应后做一些统一处理，例如错误码处理、自动登出等
 */
api.interceptors.response.use(
  // 成功接收到响应时的拦截逻辑
  (response) => {
    // 直接返回响应数据，不做额外处理
    return response
  },
  // 接收响应失败时的拦截逻辑（如服务器返回错误状态码）
  (error) => {
    // 判断是否是 HTTP 响应错误，并且状态码为 401（未授权）
    if (error.response && error.response.status === 401) {
      // 获取 authStore 实例并调用登出方法，清除用户状态
      const authStore = useAuthStore()
      authStore.logoutUser()
    }

    // 将错误继续抛出，供组件或 service 中的调用方捕获处理
    return Promise.reject(error)
  }
)

/**
 * 导出自定义配置的 axios 实例
 * 其他模块可通过 import api from '@/services/axios 使用
 */
export default api